package lb.com.lingxi.config;


import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfigurationSource;

import java.util.List;
//安全配置类
//作用：读取 security 前缀的 YML 配置，整合 CORS、权限规则、CSRF 等。
@Data
@Configuration
@EnableWebSecurity
@ConfigurationProperties(prefix = "security")  // 绑定 yml 中 security 前缀的配置
public class SecurityConfig {
    private List<String> ignoreUrls;  // 对应 yml 中 security.ignore-urls

    // 注入 CORS 配置（CorsConfig 中定义的 Bean）
    private final CorsConfigurationSource corsConfigurationSource;

    public SecurityConfig(CorsConfigurationSource corsConfigurationSource) {
        this.corsConfigurationSource = corsConfigurationSource;
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                // 整合 CORS 配置
                .cors(cors -> cors.configurationSource(corsConfigurationSource))
                // 关闭 CSRF（前后端分离场景常用，若需开启则需前端传递 CSRF Token）
                .csrf(csrf -> csrf.disable())
                // 权限规则
                .authorizeHttpRequests(auth -> {
                    if (ignoreUrls != null && !ignoreUrls.isEmpty()) {
                        // 放开无需认证的接口
                        auth.requestMatchers(ignoreUrls.toArray(new String[0])).permitAll();
                    }
                    // 其他接口需认证
                    auth.anyRequest().permitAll(); // 开发环境暂时允许所有请求
                });

        return http.build();
    }
     /* 生产环境加固 ◦
    开启 CSRF（如需）：在 SecurityConfig 中
    去掉.csrf(csrf -> csrf.disable())，
    并让前端传递 CSRF Token ◦集成 OAuth2/JWT：
    扩展 SecurityConfig，添加 Token 解析、认证逻辑*/
}

